package com.quwan.app.service;

import com.quwan.app.UpdateMemberStatusForm;
import com.quwan.app.vo.*;
import com.quwan.app.vo.account.BindAccParams;
import com.quwan.app.vo.pay.TransInfoDTO;
import com.quwan.app.vo.pay.TransferParams;
import com.quwan.app.vo.pay.TransferResult;
import com.quwan.common.form.IdForm;
import com.quwan.common.result.PageResult;
import com.quwan.entity.*;
import com.quwan.manager.controller.dto.BalanceChangeLog;
import com.quwan.manager.controller.dto.MemberDTO;
import com.quwan.manager.controller.dto.MemberDetailDTO;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.function.Predicate;

/**
 * @author quan
 * @date 2021-06-07 16:04
 */

public interface MemberService {
    /**
     * 生成验证码并发送
     *
     * @param mobile 手机
     * @return
     */
    boolean generatePhoneVcode(String mobile);

    /**
     * 查询会员信息
     *
     * @param id 业务id
     * @return
     */
    TMember getMemberInfoById(String id);

    /**
     * 验证码登录
     *
     * @param mobile
     * @param code
     * @param parentId 推荐用户id
     * @return
     * @throws Exception
     */
    String vCodeLogin(String mobile, String code, Long parentId, String guestId);

    /**
     * 查询手机登录验证码
     *
     * @param mobile
     * @return
     */
    TVerifyCode getVerifyCodeByMobile(String mobile);

    /**
     * 查询会员信息
     *
     * @param mobile 手机
     * @return
     */

    TMember getMemberInfoByMobile(String mobile);

    /**
     * app 首页 个人信息数据展示
     *
     * @param mId
     * @return
     */
    MemberDashboardData getDashboardData(Long mId);

    /**
     * 查询会员金额
     *
     * @param mId 会员id
     * @return
     */
    TMember getMemberMoneyInfo(Long mId);

    /**
     * 查询会员昵称
     *
     * @param id
     * @return
     */
    String getNickNameById(Long id);

    /**
     * 查询 我关注的
     *
     * @param mId
     * @return
     */

    List<TMemberFollow> getMemberFollowObj(String mId);


    /**
     * 会员列表
     *
     * @return
     */
    PageResult<MemberDTO> users(int page, int size, String nikeName, String mobile, Long id, Long min, Long max, LocalDate minDate, LocalDate maxDate, Integer status,String name,String area,String source,Integer autoId);


    /**
     * 关注对象
     *
     * @param mId
     * @param obj
     * @param type
     * @return
     */
    boolean followMember(String mId, String obj, String type);

    /**
     * 是否已关注对象
     *
     * @param currentMemberId 当前会员
     * @param objId           目标会员id
     * @return
     */

    boolean isFollowObj(String currentMemberId, String objId);

    /**
     * 绑定第三方 唯一id
     *
     * @param id     会员id
     * @param openId
     * @return
     */

    Predicate<BindAccParams> bindWx();

    /**
     * 会员提现
     *
     * @param mId
     * @param money
     * @param type          1-提现 wx  2-zfb
     * @param transInstance
     */

    void memberTrans(String mId, String money, String type, String payKey, Function<TransferParams, TransferResult> transInstance);

    /**
     * 保存会员提现记录
     *
     * @param log
     * @return
     */

    Integer saveMemberBalanceLog(TMemberBalanceLog log);

    /**
     * 游客登录
     *
     * @param deviceId 设备id
     * @return
     */

    TGuest guestLogin(String deviceId);

    /**
     * 会员浏览用户信息 记录
     *
     * @param currentMember
     * @param targetMember
     */

    void saveMemberVisit(String currentMember, String targetMember);

    /**
     * 会员相册信息
     *
     * @param mId
     * @return
     */
    List<TMemberAlbum> getMemberAlbumsByMId(String mId);

    /**
     * 会员 建议
     *
     * @param mId
     * @param content
     * @param img
     */
    boolean addMemberAsk(String mId, String content, String img);

    /**
     * 会员 举报
     *
     * @param currentMId
     * @param targetMId
     * @param content
     * @param img
     */
    boolean addMemberReport(String currentMId,String reason, String targetMId, String content, String img);

    /**
     * 编辑会员基础信息
     *
     * @param mId
     * @param imgUrl
     * @param nickName
     * @param height
     * @param birthday
     * @param area
     * @param job
     * @param sign
     * @return
     */
    boolean editMemberInfo(Long mId, String imgUrl, String nickName, Integer height,
                           String birthday, String area, String job, String sign, Integer age,Integer gender);

    /**
     * 修改会员相册
     *
     * @param mId    会员id
     * @param imgUrl url 地址支字符串  1,2,3
     * @return
     */
    boolean updAlbums(Long mId, String imgUrl);

    /**
     * 身份证简单验证
     *
     * @param mId      用户id
     * @param name     真实姓名
     * @param gender   0女 1男
     * @param birthday 出生时间
     * @param area     地址
     * @param idCode   身份证号
     * @param urls   身份证图片
     * @return
     */
    boolean identityChecked(String mId, String name, Integer gender, String birthday, String area, String idCode,String urls);

    /**
     * 新增会员
     *
     * @param member
     * @return
     */
    boolean addMember(TMember member);

    /**
     * 修改会员状态
     *
     * @param mId
     * @param status 0禁用 1正常
     * @return
     */
    boolean changeStatus(String mId, String status);

    /**
     * 会员检索
     *
     * @param mId id条件
     * @param kw  关键字条件
     * @return
     */
    SearchMemberVo search(String mId, String kw);

    /**
     * true 该会员是vip
     *
     * @param targetMember
     * @return
     */
    boolean isVip(String targetMember);

    /**
     * 后台用户余额变更日志
     *
     * @param pageNo
     * @param pageSize
     * @param beginTme
     * @param endTime
     * @param type
     * @return
     */
    PageResult<BalanceChangeLog> memberBalanceLog(int pageNo, int pageSize, String mId, LocalDate beginTme, LocalDate endTime, String type);

    /**
     * 用户身份信息
     *
     * @param mId
     * @return
     */
    MemberDetailDTO getMemberDetailsById(String mId);


    /**
     * 新用户设置密码
     *
     * @param mId
     * @param password
     * @return
     */
    boolean saveMemberPassword(String mId, String password);

    /**
     * 用户修改密码
     *
     * @param mId
     * @param oldPassword
     * @param newPassword
     * @return
     */
    boolean updMemberPassword(String mId, String oldPassword, String newPassword);

    /**
     * 后台重置密码/修改密码
     *
     * @param member
     * @return
     */
    boolean resetMemberPassword(TMember member);

    /**
     * app 登录可以缓存的数据
     *
     * @param id
     * @return
     */
    MemberDashboardData memberCacheInfo(String id);

    /**
     * 设置用户支付密码
     *
     * @param mId
     * @param payPassword
     * @return
     */
    boolean savePayPwd(String mId, String payPassword);

    /**
     * 修改支付密码
     *
     * @param mId
     * @param oldPayPassword
     * @param newPayPassword
     * @return
     */
    boolean updPayPwd(String mId, String oldPayPassword, String newPayPassword);

    /**
     * 添加黑名单
     *
     * @param currentId
     * @param obj       拉黑对象
     * @param status    0移除 1添加
     */
    void operateBlackList(String currentId, Long obj, Integer status);

    /**
     * 黑名单列表
     *
     * @param id 会员
     * @return
     */
    PageResult<BlackListDTO> blackList(String id, int pageNo, int pageSize);

    /**
     * 当前用户是否关注 或拉黑目标
     *
     * @param currentMember
     * @param targetMember  目标
     * @return
     */
    Map<String, Long> followAndBlackList(String currentMember, String targetMember);


    /**
     * 隐私 开关
     *
     * @param id
     * @param type   1查看我发布的订单 2查看我的动态 3 查看我的粉丝
     * @param status 0关 1正常
     * @return
     */
    boolean changeSeeForStatus(String id, String type, Integer status);

    /**
     * 验证是否存在
     *
     * @param column
     * @return
     */
    boolean getMemberByColumn(String column, String value);

    /**
     * 绑定支付宝用户 唯一id
     *
     * @param id
     * @param code 调用授权页获取的code
     * @return
     */
    Predicate<BindAccParams> bindZfb();

    /**
     * 计算提现展示金额信息
     *
     * @param id     会员id
     * @param amount 提现金额
     */
    TransInfoDTO computeTransInfo(String id, String amount);

    MemberShowInfo getMemberShowInfoById(Long mId);

    /**
     * @param id        会员id
     * @param publishId 发单id
     * @param status    0取消 1收藏
     * @return
     */
    boolean collectPublishOrder(String id, String publishId, Integer status);

    /**
     * 我的粉丝详情
     *
     * @param id
     * @param pageNo
     * @param pageSize
     * @return
     */
    PageResult<MeFollowersDTO> getMyFollowersDetail(String id, int pageNo, int pageSize);

    /**
     * 我关注的详情
     *
     * @param id
     * @param pageNo
     * @param pageSize
     * @return
     */
    PageResult<MeFollowersDTO> getMyFollowDetail(String id, int pageNo, int pageSize);

    /**
     * 我收藏的订单信息列表
     *
     * @param id
     * @param pageNo
     * @param pageSize
     * @return
     */
    PageResult<FollowOrderDTO> getMyCollectOrderList(String id, int pageNo, int pageSize);

    /**
     * 我的收藏 (赞过)  动态列表
     *
     * @param id
     * @param pageNo
     * @param pageSize
     * @return
     */
    PageResult<MemberDynamicDTO> getMyZanDynamicList(String id, int pageNo, int pageSize);

    /**
     * 会员设置 通知消息提醒 开关
     * @param id
     * @param type 1订单 2聊天 3动态
     * @param status
     * @return
     */
    boolean changeMsgNoticeStatus(String id, String type, Integer status);

    /**

     * 用户注销
     * @param idForm
     * @return
     */
    boolean updateMember(String id,String  autoId);
/*
     * 账号绑定手机号
     * @param id
     * @param mobile
     * @param code
     * @return
     */
    boolean bindPhone(String id, String mobile, String code);

    /**
     * 验证手机验证码
     * @param mobile
     * @param code
     */
    public void authPhoneCode(String mobile, String code);

    /**
     * 人脸认证
     * @param id
     * @param url
     * @return
     */
    boolean authFace(String id, String url);

    /**
     * 后台真人审核列表
     * @param page
     * @param size
     * @param name 用户名
     * @param faceStatus 状态
     * @return
     */
    PageResult<MemberDTO> usersCheckedList(int page, int size, String name, Integer faceStatus, String autoId);

    /**
     * 后台真人审核  状态
     * @param autoId
     * @param faceStatus
     * @return
     */
    boolean checkedFaceStatus(String autoId, Integer faceStatus);

    /**
     * 我的足迹  历史访问订单列表
     * @param id 用户id
     * @param pageNo
     * @param pageSize
     * @return
     */
    PageResult<FollowOrderDTO> getMyAccessHistoryOrderList(String id, int pageNo, int pageSize);

    /**
     * 下单 订单评价列表
     * @param id
     * @param pageNo
     * @param pageSize
     * @return
     */
    PageResult<ConsumeOrderCommentDTO> getMyCommentOrderList(String id, int pageNo, int pageSize,String type);

    /**
     * 首页推荐用户数据列表
     * @param pageNo
     * @param pageSize
     * @return
     */
    PageResult<RecommendMemberDTO> getRecommendMemberList(int pageNo, int pageSize, String auto, String gender, Integer age);

    /**
     * app系统消息
     * @return
     */
    Function<MsgQueryParams, PageResult<SystemMsgResult>> getSystemMsgList();
    /**
     * app个人消息
     * @return
     */
    Function<MsgQueryParams, PageResult<SystemMsgResult>> getPersonalMsgList();

    /**
     * app广场消息
     * @return
     */
    Function<MsgQueryParams, PageResult<SystemMsgResult>> getDynamicMsgList();

    /**
     * app订单消息
     * @return
     */
    Function<MsgQueryParams, PageResult<SystemMsgResult>> getOrderCommentMsgList();

    /**
     * 访客列表
     * @param id
     * @param pageNo
     * @param pageSize
     * @return
     */
    PageResult<MemberShowInfo> getVisitList(String id, int pageNo, int pageSize);

    /**
     * 身份证审核列表
     * @param page
     * @param size
     * @param status
     * @return
     */
    PageResult<MemberDTO> usersIdentityList(int page, int size, Integer status, String autoId,String id);

    /**
     * 实名认证状态修改
     * @param autoId
     * @param status
     * @return
     */
    boolean identityStatus(String autoId, Integer status);

    /**
     * 拉取系统会话列表
     * @param id
     */
    void pullSystemSession(String id);

    /**
     * 我的推广数据
     * @param id 用户id
     *
     * @return
     */
    MemberSpreadDataDTO getMemberSpreadData(String id);

    /**
     * 推广详情
     * @param id
     * @return
     */
    PageResult<MemberSpreadList> getMemberSpreadList(String id,int pageNo,int pageSize);

    boolean identityCheckedNew(String mId, String name, int sex, String bir, String lifeUrl, String idCode, String urls);


    String getHomeBackground(Long id);

    void addBackGround(String id, String url);

    /**
     * 发单派单检查
     * @param id
     * @return
     */
    ActionDTO actionCheck(String id);
}
